package 动态规划.可dp可二分;

import java.util.Arrays;

/**
 * @author aodre , QQ : 480029069
 * @date 2023/1/22 19:40
 */
public class leetcode2541使数组元素相等的最小操作数 {

    /*
    这本质上 是一个数学题！
    注意这里面的 不变的量
    nums[i] + k , nums[j] - k 这样操作的结果就是  sum 不变
    -----
    这里 还有一个 转换，将两个数组 转换成一个数组 ，进行 计算
    ---
    注意 每次操作 都是 一对 ， 一对的操作的 ！
    这一点，有助于 下面过程的理解
     */
    public long solution(int[] nums1,int[]nums2,int k){
        long count = 0,sum = 0;
        // 特殊情况的判断
        if(k == 0){
            return Arrays.equals(nums1,nums2) ? 0 : -1;
        }
        for(int i = 0;i < nums1.length;i++){
            int temp = nums1[i] - nums2[i];
            count += temp/k >= 0 ? temp / k : 0;
            sum += nums1[i] - nums2[i];
        }
        return sum == 0 ? count : -1;
    }




    // -------------------------------------------------------------------------
    //下面是 lc1551， 使数组相等的 最小操作数I
    // 这个题 是在 一个数组中操作
    // 也是 一个数学的问题
    public int solutionI(int n){
        int ans = 0;
        int mid = n;
        for(int i = 0 ;i * 2 + 1 < n;i++){
            ans += n - (i * 2 + 1);
        }
        return ans;
    }

// 标准的数学题 ， 最优解 就是  return n ^ 2 / 4;


}
